#include "main.h"
// 要求将所有代码写在本文件
int ListInitiate(SLNode** head)/*初始化*/ {
    (*head) = (SLNode*)malloc(sizeof(SLNode));
    if (!*head) {
        return 1;
    }
    (*head)->next = NULL;
    return 0;
}

int ListLength(SLNode* head) /* 单链表的长度*/ {
    int length = 0;
    SLNode* p;
    p = head->next;
    while (p) {
        length++;
        p = p->next;
    }
    return length;
}

int ListInsert(SLNode* head, int i, DataType x) {
    SLNode* p = head, * s; int j = 0;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i)return 1;
    s = (SLNode*)malloc(sizeof(SLNode));
    s->data = x;
    s->next = p->next;
    p->next = s;
    return 0;
}

int ListDelete(SLNode* head, int i, DataType* x) {
    SLNode* p = head, * q;
    int j = 0;
    while ((p->next) && (j < i)) {
        p = p->next;
        j++;
    }
    if (!(p->next) || (j > i)) {
        return 1;
    }
    q = p->next;
    p->next = q->next;
    *x = q->data;
    free(q);
    return 0;
}

int ListGet(SLNode* head, int i, DataType* x) {
    SLNode* p; int j = 0;
    p = head->next;
    while (p && j < i)
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i) {
        return 1;
    }
    *x = p->data;
    return 0;
}

int Destroy(SLNode** head)
{
    SLNode* p, * q;
    p = (*head)->next;
    if (*head == NULL) {
        return 1;
    }
    while (p != NULL) {
        q = p->next;
        free(p);
        p = q;
    }
    (*head)->next = NULL;
    return 0;
}

int main(void) {
    SLNode* head;
    int i, x;
    ListInitiate(&head);/*初始化*/
    for (i = 0; i < 10; i++) {
        if (ListInsert(head, i, i + 1) != 0) /*插入10个数据元素*/
        {
            printf("错误! \n");
            return 1;
        }
    }
    if (ListDelete(head, 4, &x) != 0) { /*删除数据元素5*/
        printf("错误! \n");
        return 0;
    }
    printf("%d\n", ListLength(head));
    for (i = 0; i < ListLength(head); i++) {
        if (ListGet(head, i, &x) != 0) /*取元素*/
        {
            printf("错误!d \n");
            return 1;
        }
        else printf("%d    ", x);/*显示数据元素*/
    }
    Destroy(&head);
}